/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modele;

import Modele.Comparators.ComparatorGroupes_ZA;
import ecoute.Ecouteur;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Contient une liste de groupes.
 * @see Groupe
 * @author Jo
 */
public final class Modele extends AbstractGM{
    
    //
    /**
     * Cree une liste test.
     * pour le dev, mettre a "true" si on change le code du modele. mettre a "false"
     * pour le deploiement.
     */
    static final boolean CREATION_MANUELLE = false;
    
    public List<Groupe> groupes;//HashSet
    
    public Modele() {
        
        if(CREATION_MANUELLE){
            Contact.compteur = 0;
            groupes = new ArrayList<Groupe>();

            ajouterGroupe("Famille");
            ajouterContact(new Contact("C:\\Users\\Jo\\Pictures\\fiat-abarth-wheel.jc.jpg", 
                    "moss", "jo", new Adresse(), new Adresse(), "0678009911", "", "", "", ""), 0);
            ajouterContact(new Contact("", "stein", "lolo", new Adresse(), new Adresse(), "0908071122", "", "", "", ""), 0);
            
            ajouterGroupe("Amis");
            ajouterContact(new Contact("", "s", "tata", new Adresse(), new Adresse(), "01", "", "", "", ""), 1);
            ajouterContact(new Contact("", "h", "antoine", new Adresse(), new Adresse(), "02", "", "", "", ""), 1);
            
            ajouterGroupe("Collegues");
        }
        
        chargerModele();
        
    }
    
    public void ajouterGroupe(String nom){
        groupes.add(new Groupe(nom));
        fireIntervalAdded(this, groupes.size()-1, groupes.size()-1);
        fireSomethingChanged(Ecouteur.AJOUT_GROUPE);
        enregistrerModele();
    }
    
    public void supprimerGroupe(int indexGroupe){
        groupes.remove(indexGroupe);
        fireIntervalRemoved(this, indexGroupe, indexGroupe);
        fireSomethingChanged(Ecouteur.SUPPR_GROUPE);
        enregistrerModele();
    }
    
    public void ajouterContact(Contact contact, int indexGroupe){
        getGroupe(indexGroupe).ajouterContact(contact);
        enregistrerModele();
    }
    
    public void modifierContact(Contact contact, int indexGroupe, int indexContact){
        getGroupe(indexGroupe).modifierContact(indexContact, contact);
        enregistrerModele();
    }
    public void supprimerContact(int index, int indexGroupe){
        getGroupe(indexGroupe).supprimerContact(index);
        enregistrerModele();
    }
    
    public Groupe getGroupe(int indexGroupe){
        return groupes.get(indexGroupe);
        //return (Groupe) groupes.toArray()[indexGroupe];
    }
    
    
    public void sort_AZ(){
        Collections.sort(groupes, new Comparators().new ComparatorGroupes_AZ());
        fireContentsChanged(this, 0, groupes.size()-1);
        fireSomethingChanged(Ecouteur.TRI_GROUPES);
    }
    public void sort_ZA(){
        Collections.sort(groupes, new Comparators().new ComparatorGroupes_ZA());
        fireContentsChanged(this, 0, groupes.size()-1);
        fireSomethingChanged(Ecouteur.TRI_GROUPES);
    }
    
    /**
     * Charge la liste de groupes.
     */
    private void chargerModele(){
        try {
            FileInputStream fichier = new FileInputStream("all_contacts.ser");
            ObjectInputStream ois = new ObjectInputStream(fichier);
            groupes = (ArrayList<Groupe>) ois.readObject();
            
            int idMax=-1;
            for (Groupe groupe : groupes) {
                for (Contact contact : groupe.contacts) {
                    if(contact.identifiant > idMax){
                        idMax = contact.identifiant;
                    }
                }
            }
            Contact.compteur = idMax + 1;
            
        } 
        catch (java.io.IOException e) { e.printStackTrace(); }
        catch (ClassNotFoundException e) { e.printStackTrace(); }
    }
    
    /**
     * Enregistre la liste de groupes.
     */
    public void enregistrerModele(){
        try {
            FileOutputStream fichier = new FileOutputStream("all_contacts.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fichier);
            oos.writeObject(groupes);
            oos.flush();
            oos.close();
        }
        catch (java.io.IOException e) { e.printStackTrace(); }
    }
    
    //AbstractListModel
    @Override
    public int getSize() {
        return groupes.size();
    }

    @Override
    public Object getElementAt(int index) {
        return getGroupe(index);
    }
    
    
    
}
